#!/bin/bash

# 物理机部署启动脚本
# 统一使用nginx代理，前端端口9980，后端端口9900

set -e

echo "开始启动物理机模式..."

# 检查nginx是否安装
if ! command -v nginx &> /dev/null; then
    echo "错误: Nginx 未安装，请先安装nginx"
    echo "Ubuntu/Debian: sudo apt-get install nginx"
    echo "CentOS/RHEL: sudo yum install nginx"
    exit 1
fi

# 检查Node.js是否安装
if ! command -v node &> /dev/null; then
    echo "错误: Node.js 未安装"
    exit 1
fi

# 检查Python是否安装
if ! command -v python3 &> /dev/null; then
    echo "错误: Python3 未安装"
    exit 1
fi

# 创建必要的目录
mkdir -p data config logs

# 检查端口是否被占用
echo "检查端口占用情况..."
if netstat -tlnp 2>/dev/null | grep -q ":9980 "; then
    echo "警告: 端口9980已被占用"
fi

if netstat -tlnp 2>/dev/null | grep -q ":9900 "; then
    echo "警告: 端口9900已被占用"
fi

if netstat -tlnp 2>/dev/null | grep -q ":9981 "; then
    echo "错误: 端口9981已被占用，无法启动服务"
    exit 1
fi

# 停止可能运行的服务
echo "停止现有服务..."
pkill -f "uvicorn app.main:app" 2>/dev/null || true
pkill -f "vite" 2>/dev/null || true
# 强制释放9980和9981端口
echo "释放端口..."
if command -v lsof &> /dev/null; then
    lsof -ti :9980 | xargs kill -9 2>/dev/null || true
    lsof -ti :9981 | xargs kill -9 2>/dev/null || true
elif command -v fuser &> /dev/null; then
    fuser -k 9980/tcp 2>/dev/null || true
    fuser -k 9981/tcp 2>/dev/null || true
fi

# 配置nginx
echo "配置nginx..."
  # 复制并配置nginx文件
  cp -f config/nginx.conf /etc/nginx/sites-available/torrentchecker
  
  # 检查配置文件
  echo "检查Nginx配置..."
  CONFIG_FILE="/etc/nginx/sites-available/torrentchecker"
  if [ ! -f "$CONFIG_FILE" ]; then
      echo "❌ 配置文件不存在"
      exit 1
  fi
ln -sf /etc/nginx/sites-available/torrentchecker /etc/nginx/sites-enabled/
rm -f /etc/nginx/sites-enabled/default
# 直接使用nginx命令启动并捕获错误
nginx -t 2>&1 | tee nginx-test.log
nginx_exit_code=${PIPESTATUS[0]}
  if [ $nginx_exit_code -ne 0 ]; then
      echo "Nginx配置错误详情:"
      cat nginx-test.log
      exit 1
  fi

# 兼容检查9980端口占用情况
    echo "检查9980端口占用情况..."
    if command -v ss &> /dev/null; then
        PORT_CHECK="ss -tuln | grep -q :9980"
    elif command -v netstat &> /dev/null; then
        PORT_CHECK="netstat -tuln | grep -q :9980"
    elif command -v lsof &> /dev/null; then
        PORT_CHECK="lsof -i :9980"
    else
        echo "警告：无法检查端口占用，缺少ss/netstat/lsof工具"
        PORT_CHECK="false"
    fi

    if eval $PORT_CHECK; then
        echo "错误：9980端口已被占用，无法启动Nginx"
        exit 1
    fi

  # 确保日志目录存在并设置权限
  mkdir -p /var/log/nginx
  chmod 755 /var/log/nginx

  # 检查Nginx配置文件权限
  echo "检查Nginx配置文件权限..."
  ls -l /etc/nginx/nginx.conf
  ls -l /etc/nginx/sites-available/torrentchecker

  # 显示Nginx配置内容
  echo "Nginx站点配置内容..."
  cat /etc/nginx/sites-available/torrentchecker

  # 显示系统和Nginx版本信息
    echo "系统信息: $(uname -a)"
    echo "Nginx版本: $(nginx -v 2>&1)"

    # 检查Nginx可执行文件权限
    echo "Nginx可执行文件权限: $(ls -l $(which nginx))"

    # 详细配置测试
    echo "执行详细配置测试..."
    nginx -t -q || { echo "配置测试失败"; exit 1; }

    # 检查strace是否可用
    if ! command -v strace &> /dev/null; then
        echo "警告：strace未安装，无法进行系统调用追踪"
        STRACE_CMD=""
    else
        STRACE_CMD="strace -f -o nginx_strace.log"
    fi

    # 验证Nginx配置中引用的目录和权限
    echo "验证配置文件中引用的目录和权限..."
    CONFIG_DIRS=$(awk '/root|access_log|error_log/ {print $2}' /etc/nginx/sites-available/torrentchecker | grep -v ';' | sort -u)
    for DIR in $CONFIG_DIRS; do
        if [ ! -d "$DIR" ]; then
            echo "错误：配置文件中引用的目录不存在 - $DIR"
            echo "正在创建缺失目录: $DIR"
            mkdir -p "$DIR" && chmod 755 "$DIR"
        else
            echo "检查目录权限: $DIR"
            ls -ld "$DIR"
            # 确保目录有正确的执行权限
            if [ $(( $(stat -c %a "$DIR") & 0111 )) -eq 0 ]; then
                echo "警告：目录缺少执行权限，添加执行权限: $DIR"
                chmod +x "$DIR"
            fi
        fi
    done

    # 检查Nginx工作进程用户
    echo "检查Nginx运行用户..."
    NGINX_USER=$(grep -r 'user' /etc/nginx/nginx.conf /etc/nginx/sites-available/ | grep -v '#' | head -n 1 | awk '{print $2}' | sed 's/;//')
    if [ -z "$NGINX_USER" ]; then
        NGINX_USER="www-data"
        echo "未找到Nginx用户配置，使用默认用户: $NGINX_USER"
    else
        echo "Nginx配置用户: $NGINX_USER"
    fi

    # 检查Nginx用户是否存在
    if ! id -u "$NGINX_USER" > /dev/null 2>&1; then
        echo "错误：Nginx配置的用户 $NGINX_USER 不存在"
        exit 1
    fi

    # 检查日志文件权限
    echo "检查日志文件权限..."
    LOG_FILES=$(grep -r 'access_log\|error_log' /etc/nginx/sites-available/ | grep -v '#' | awk '{print $2}' | sed 's/;//')
    for FILE in $LOG_FILES; do
        if [ -f "$FILE" ]; then
            ls -l "$FILE"
            if ! stat -c %U "$FILE" | grep -q "$NGINX_USER"; then
                echo "警告：日志文件 $FILE 所有者不是 $NGINX_USER，修改所有者"
                chown $NGINX_USER:$NGINX_USER "$FILE"
            fi
        else
            echo "日志文件不存在，将在启动时创建: $FILE"
            DIR=$(dirname "$FILE")
            chown -R $NGINX_USER:$NGINX_USER "$DIR"
        fi
    done

    # 尝试启动Nginx并捕获所有输出
    echo "尝试启动Nginx..."
    # 后台启动Nginx
$STRACE_CMD nginx -g "error_log /var/log/nginx/error.log debug;" &
# 等待Nginx启动
sleep 2
EXIT_CODE=$?

    if [ -n "$STRACE_CMD" ]; then
        echo "strace日志已保存到nginx_strace.log"
        cat nginx_strace.log | grep -iE "error|fail|denied|permission" | head -n 20
    fi

    if [ $EXIT_CODE -ne 0 ]; then
        echo "Nginx启动失败，退出码: $EXIT_CODE"
        echo "完整错误输出:"
        echo "$ERROR_OUTPUT"
        exit 1
    fi

# 安装前端依赖（如果需要）
echo "检查前端依赖..."
cd frontend
if [ ! -d "node_modules" ]; then
    echo "安装前端依赖..."
    npm install
fi
cd ..

# 安装后端依赖（如果需要）
echo "检查后端依赖..."
cd backend
if [ ! -d "venv" ]; then
    echo "创建Python虚拟环境..."
    python3 -m venv venv
fi
source venv/bin/activate
pip install -r requirements.txt
cd ..

# 启动后端服务
echo "启动后端服务..."
cd backend
source venv/bin/activate
nohup ./run.sh > ../logs/backend.log 2>&1 &
BACKEND_PID=$!
echo $BACKEND_PID > ../logs/backend.pid
cd ..

# 构建前端生产版本
echo "构建前端生产版本..."
cd frontend
if [ ! -d "node_modules" ]; then
    npm install
fi
npm run build

# 创建Nginx可访问的前端文件目录
echo "部署前端文件到Nginx目录..."
mkdir -p /var/www/torrentchecker
# 安全地清理旧文件
rm -rf /var/www/torrentchecker/*
# 复制新构建的前端文件到Nginx可访问目录
if [ -d "dist" ]; then
    cp -r /root/devworks/torrentfileschecker/frontend/dist/* /var/www/torrentchecker/
    # 设置权限
    chmod -R 755 /var/www/torrentchecker
    chown -R www-data:www-data /var/www/torrentchecker
    chmod -R 755 /root/devworks/torrentfileschecker/frontend
    chown -R www-data:www-data /root/devworks/torrentfileschecker/frontend
    chmod -R 755 /root/devworks/torrentfileschecker/frontend/dist
    chown -R www-data:www-data /root/devworks/torrentfileschecker/frontend/dist
else
    echo "❌ 前端构建失败，dist目录不存在"
    exit 1
fi
cd ..

# 等待服务启动
echo "等待服务启动..."
sleep 5

# 检查服务状态
echo "检查服务状态..."
if ps -p $BACKEND_PID > /dev/null; then
    echo "✅ 后端服务启动成功 (PID: $BACKEND_PID)"
else
    echo "❌ 后端服务启动失败"
    cat logs/backend.log
    exit 1
fi

# 检查前端构建结果
if [ ! -d "frontend/dist" ]; then
    echo "❌ 前端构建失败"
    cat logs/frontend.log
    exit 1
else
    echo "✅ 前端构建成功"
fi

# 健康检查
echo "执行健康检查..."
for i in {1..30}; do
    if curl -f http://localhost:9980/ >/dev/null 2>&1; then
        echo "✅ 服务启动成功！"
        echo "前端访问地址: http://localhost:9980/"
        echo "API访问地址: http://localhost:9980/api/"
        echo "后端直接访问: http://localhost:9900/"
        echo ""
        echo "日志文件:"
        echo "  前端日志: logs/frontend.log"
        echo "  后端日志: logs/backend.log"
        echo ""
        echo "停止服务请运行: ./stop-physical.sh"
        exit 0
    fi
    echo "等待服务启动... ($i/30)"
    sleep 2
done

# 测试后端API连接
echo "测试后端API连接..."
API_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:9900/api/config/)
if [ "$API_RESPONSE" -ne 200 ]; then
    echo "❌ 后端API测试失败，HTTP状态码: $API_RESPONSE"
    echo "尝试通过Nginx代理测试..."
    API_RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:9980/api/config/)
    if [ "$API_RESPONSE" -ne 200 ]; then
        echo "❌ Nginx代理测试也失败，HTTP状态码: $API_RESPONSE"
        exit 1
    else
        echo "✅ Nginx代理测试成功"
    fi
else
    echo "✅ 后端API测试成功"
fi
echo "❌ 服务启动超时"
echo "请检查日志文件:"
echo "  前端日志: logs/frontend.log"
echo "  后端日志: logs/backend.log"
exit 1